widget: Don't assume opacity is 100%
authorBenjamin Otte <otte@redhat.com>
Sat, 6 Sep 2014 04:41:05 +0000 (06:41 +0200)
committerBenjamin Otte <otte@redhat.com>
Sat, 6 Sep 2014 23:57:10 +0000 (01:57 +0200)
... just because there is no style context instantiated yet. Instead,
instantiate a style context during realize() and ask it.

Fixes problems with dim labels not being dimmed on first show.

Testcase included.

https://bugzilla.gnome.org/show_bug.cgi?id=735240

gtk/gtkwidget.c
testsuite/reftests/Makefile.am
testsuite/reftests/opacity-initial.css [new file with mode: 0644]
testsuite/reftests/opacity-initial.ref.ui [new file with mode: 0644]
testsuite/reftests/opacity-initial.ui [new file with mode: 0644]

index 6f93a597b323ffdc3674139992b746426318d4a3..2593cbf14c3a949a57aab6b72da3fc7bd2de592a 100644 (file)
@@ -5527,9 +5527,7 @@ gtk_widget_realize (GtkWidget *widget)
       _gtk_widget_enable_device_events (widget);
       gtk_widget_update_devices_mask (widget, TRUE);
 
-      if (gtk_widget_is_toplevel (widget))
-       gdk_window_set_opacity (priv->window,
-                               priv->alpha / 255.0);
+      gtk_widget_update_alpha (widget);
 
       if (priv->context)
        gtk_style_context_set_scale (priv->context, gtk_widget_get_scale_factor (widget));
@@ -15913,6 +15911,7 @@ static void
 gtk_widget_update_alpha (GtkWidget *widget)
 {
   GtkWidgetPrivate *priv;
+  GtkStyleContext *context;
   gdouble opacity;
   guint8 alpha;
 
@@ -15920,15 +15919,13 @@ gtk_widget_update_alpha (GtkWidget *widget)
 
   alpha = priv->user_alpha;
 
-  if (priv->context)
-    {
-      opacity =
-       _gtk_css_number_value_get (_gtk_style_context_peek_property (priv->context,
-                                                                    GTK_CSS_PROPERTY_OPACITY),
-                                  100);
-      opacity = CLAMP (opacity, 0.0, 1.0);
-      alpha = round (priv->user_alpha * opacity);
-    }
+  context = gtk_widget_get_style_context (widget);
+  opacity =
+    _gtk_css_number_value_get (_gtk_style_context_peek_property (context,
+                                                                 GTK_CSS_PROPERTY_OPACITY),
+                               100);
+  opacity = CLAMP (opacity, 0.0, 1.0);
+  alpha = round (priv->user_alpha * opacity);
 
   if (alpha == priv->alpha)
     return;
index 5f84f8c81ffdb006abcef3c0231c391c5fb2cdb6..0853a007f55f182762d45652236c520913f5304e 100644 (file)
@@ -314,6 +314,9 @@ testdata = \
        opacity.css \
        opacity.ui \
        opacity.ref.ui \
+       opacity-initial.css \
+       opacity-initial.ref.ui \
+       opacity-initial.ui \
        overlay-no-main-widget.ref.ui \
        overlay-no-main-widget.ui \
        paned-undersized.css \
diff --git a/testsuite/reftests/opacity-initial.css b/testsuite/reftests/opacity-initial.css
new file mode 100644 (file)
index 0000000..611a8cd
--- /dev/null
@@ -0,0 +1,3 @@
+GtkLabel {
+  opacity: 0;
+}
diff --git a/testsuite/reftests/opacity-initial.ref.ui b/testsuite/reftests/opacity-initial.ref.ui
new file mode 100644 (file)
index 0000000..1240351
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.1 -->
+<interface>
+  <requires lib="gtk+" version="3.12"/>
+  <object class="GtkWindow" id="window1">
+    <property name="width_request">200</property>
+    <property name="height_request">100</property>
+    <property name="can_focus">False</property>
+    <property name="type">popup</property>
+  </object>
+</interface>
diff --git a/testsuite/reftests/opacity-initial.ui b/testsuite/reftests/opacity-initial.ui
new file mode 100644 (file)
index 0000000..9e02798
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.1 -->
+<interface>
+  <requires lib="gtk+" version="3.12"/>
+  <object class="GtkWindow" id="window1">
+    <property name="width_request">200</property>
+    <property name="height_request">100</property>
+    <property name="can_focus">False</property>
+    <property name="type">popup</property>
+    <child>
+      <object class="GtkOverlay" id="overlay1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <child>
+          <placeholder/>
+        </child>
+        <child type="overlay">
+          <object class="GtkLabel" id="label1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">I'm the invisible label.
+Incredible how you can
+see right through me.</property>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>